package Maze;//迷宫
//        题目描述
//
//        本题为填空题，只需要算出结果后，在代码中使用输出语句将所填结果输出即可。
//
//        下图给出了一个迷宫的平面图，其中标记为 11 的为障碍，标记为 00 的为可以通行的地方。
//
//        010000
//        000100
//        001001
//        110000
//        [copy]
//
//        迷宫的入口为左上角，出口为右下角，在迷宫中，只能从一个位置走到这 个它的上、下、左、右四个方向之一。
//
//        对于上面的迷宫，从入口开始，可以按 DRRURRDDDR 的顺序通过迷宫， 一共 1010 步。其中 D、U、L、RD、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫（3030 行 5050 列），请找出一种通过迷宫的方式，其使用的步数最少，在步数最少的前提下，请找出字典序最小的一个作为答案。
//
//        请注意在字典序中 D<L<R<UD<L<R<U。
//
//        01010101001011001001010110010110100100001000101010
//        00001000100000101010010000100000001001100110100101
//        01111011010010001000001101001011100011000000010000
//        01000000001010100011010000101000001010101011001011
//        00011111000000101000010010100010100000101100000000
//        11001000110101000010101100011010011010101011110111
//        00011011010101001001001010000001000101001110000000
//        10100000101000100110101010111110011000010000111010
//        00111000001010100001100010000001000101001100001001
//        11000110100001110010001001010101010101010001101000
//        00010000100100000101001010101110100010101010000101
//        11100100101001001000010000010101010100100100010100
//        00000010000000101011001111010001100000101010100011
//        10101010011100001000011000010110011110110100001000
//        10101010100001101010100101000010100000111011101001
//        10000000101100010000101100101101001011100000000100
//        10101001000000010100100001000100000100011110101001
//        00101001010101101001010100011010101101110000110101
//        11001010000100001100000010100101000001000111000010
//        00001000110000110101101000000100101001001000011101
//        10100101000101000000001110110010110101101010100001
//        00101000010000110101010000100010001001000100010101
//        10100001000110010001000010101001010101011111010010
//        00000100101000000110010100101001000001000000000010
//        11010000001001110111001001000011101001011011101000
//        00000110100010001000100000001000011101000000110011
//        10101000101000100010001111100010101001010000001000
//        10000010100101001010110000000100101010001011101000
//        00111100001000010000000110111000000001000000001011
//        10000001100111010111010001000110111010101101111000
import java.util.Arrays;
import java.util.LinkedList;
public class MazeBfs2 {
    //下左右上
    static int[] dx = {1, 0, 0, -1};
    static int[] dy = {0, -1, 1, 0};
    static char[] path = {'D', 'L', 'R', 'U'};
    public static void main(String[] args) {
        String str = "01010101001011001001010110010110100100001000101010\n" +
                "00001000100000101010010000100000001001100110100101\n" +
                "01111011010010001000001101001011100011000000010000\n" +
                "01000000001010100011010000101000001010101011001011\n" +
                "00011111000000101000010010100010100000101100000000\n" +
                "11001000110101000010101100011010011010101011110111\n" +
                "00011011010101001001001010000001000101001110000000\n" +
                "10100000101000100110101010111110011000010000111010\n" +
                "00111000001010100001100010000001000101001100001001\n" +
                "11000110100001110010001001010101010101010001101000\n" +
                "00010000100100000101001010101110100010101010000101\n" +
                "11100100101001001000010000010101010100100100010100\n" +
                "00000010000000101011001111010001100000101010100011\n" +
                "10101010011100001000011000010110011110110100001000\n" +
                "10101010100001101010100101000010100000111011101001\n" +
                "10000000101100010000101100101101001011100000000100\n" +
                "10101001000000010100100001000100000100011110101001\n" +
                "00101001010101101001010100011010101101110000110101\n" +
                "11001010000100001100000010100101000001000111000010\n" +
                "00001000110000110101101000000100101001001000011101\n" +
                "10100101000101000000001110110010110101101010100001\n" +
                "00101000010000110101010000100010001001000100010101\n" +
                "10100001000110010001000010101001010101011111010010\n" +
                "00000100101000000110010100101001000001000000000010\n" +
                "11010000001001110111001001000011101001011011101000\n" +
                "00000110100010001000100000001000011101000000110011\n" +
                "10101000101000100010001111100010101001010000001000\n" +
                "10000010100101001010110000000100101010001011101000\n" +
                "00111100001000010000000110111000000001000000001011\n" +
                "10000001100111010111010001000110111010101101111000\n";
        String[] strings = str.split("\n");
        int[][] map = new int[strings.length][strings[0].length()];
        int[][] isFlag = new int[strings.length][strings[0].length()];
        for (int i = 0; i < strings.length; i++) {
            char[] charArray = strings[i].toCharArray();
            for (int j = 0; j < charArray.length; j++) {
                map[i][j] = Integer.parseInt(String.valueOf(charArray[j]));
            }
        }
        int y1 = 30;
        int y2 = 50;
        node start = new node(0, 0, 0, "");
        Bfs(map, isFlag, y1, y2, start);
    }

    public static void Bfs(int[][] map, int[][] isFlag, int y1, int y2, node start) {
        int count = 0;
        LinkedList<node> linkedList = new LinkedList<>();
        linkedList.offer(start);
        isFlag[start.getX()][start.getY()] = 1;
        while (!linkedList.isEmpty()) {
            node peek = linkedList.peek();
            int x = peek.getX();
            int y = peek.getY();
            if (x == y1 - 1 && y == y2 - 1) {
                count = 1;
                System.out.println(peek.getStep());
                System.out.println(peek.getStr());
                print(isFlag);
                break;
            }
            for (int i = 0; i <= 3; i++) {
                int tx = x + dx[i];
                int ty = y + dy[i];
                if (tx >= 0 && tx < map.length &&
                        ty >= 0 && ty < map[0].length &&
                        map[tx][ty] != 1 && isFlag[tx][ty] != 1) {
                    node temp = new node(tx, ty, peek.step + 1, peek.str + path[i]);
                    isFlag[tx][ty] = 1;
                    linkedList.offer(temp);
                }
            }
            linkedList.poll();
        }
        if (count == 0) {
            System.out.println(-1);
        }
    }

    static class node {
        int x;
        int y;
        int step;
        String str;

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

        public int getStep() {
            return step;
        }

        public String getStr() {
            return str;
        }

        public node(int x, int y, int step, String str) {
            this.x = x;
            this.y = y;
            this.step = step;
            this.str = str;
        }
    }

    private static void print(int[][] map) {
        System.out.println("====");
        for (int[] line : map) {
            System.out.println(Arrays.toString(line));
        }
        System.out.println("====");
    }
}
